package com.study.kt._02feature

/**
 * lambda一般和高阶函数一起使用，也可以单独存在
 */
fun main_() {
    //无参lambda表达式,定以后不会执行，使用()调用
    {
        println("hello")
    }()

    //有参
    val sum = { a: Int, b: Int ->
        a + b
    }(1, 2)

    println(sum)

    //lambda表达式最后一行就是返回值
    val res = {
        "fauks"
        3
        println()//->返回Unit
    }()
    println(res)

    //lambda使用it 如果lambda只有一个参数，则他可以用隐形的it代替
    addTest(10) { res ->
        println(res)
    }
    var a = 10
    //在kotlin中，函数是一等公民，内部函数也可以访问外部函数的变量，如同内部类访问外部类的属性一样
    addTest(a) {
        println(it) //可以使用it代替上面的res
    }
}

fun addTest(a: Int, action: (Int) -> Unit) {
    action(a + 10)
}

// lambda带参数与不带参数 比较
fun main() {
    test1(x = 12, block = {
        println("test1")
    })
    println("----")
    // test2需要接收一个带Int的参数，而我们传递的是无参的
    // 这是kt的一种隐式参数传递
    test2(10) {
        println("hello $it")
    }
}

fun test1(x: Int, block: () -> Unit) {
    println("x=$x")
    block.invoke()
}

fun test2(x: Int, block: (Int) -> Unit) {
    block(x)
}